#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
using namespace std;
//struct Node
//{
//	int data;
//	Node* next;
//};
//Node* head, * p, * r;
//int x = 0;
//void insert(Node* head, int i, int x)
//{
//	Node* p, * s;
//	int j = 0;
//	p = head;
//	while ((p != NULL) && (j < i - 1))
//	{
//		p = p->next;
//		j = i - 1;
//	}
//	if (p == NULL)
//	{
//		return;
//	}
//	else
//	{
//		s = new Node;
//		s->data = x;
//		s->next = p->next;
//		p->next = s;
//	}
//}
//void del(Node* head, int i)
//{
//	Node* p, * s;
//	int j = 0;
//	p = head;
//	while ((p != NULL) && (j < i - 1))
//	{
//		p = p->next;
//		j = i + 1;
//	}
//	if (p == NULL)
//	{
//		return;
//	}
//	else
//	{
//		s = p->next;
//		p->next = p->next->next;
//		free(s);
//	}
//}
//int main()
//{
//	cin >> x;
//	head = new Node;
//	r = head;
//	while (x != -1)
//	{
//		p = new Node;
//		p->data = x;
//		p->next = NULL;
//		r->next = p;
//		r = p;
//		cin >> x;
//	}
//	p = head -> next;
//	while (p->next != NULL)
//	{
//		cout << p->data << " ";
//		p = p->next;
//	}
//	cout << p->data << endl;
//	p = head->next;
//	int i = 0;
//	while (p -> next != NULL)
//	{
//		if (p->data == 3)
//		{
//        	i++;
//		}
//		p = p->next;
//	}
//	cout << i << endl;
//	insert(head, 2, 99);
//	p = head->next;
//	while (p->next != NULL)
//	{
//		cout << p->data << " ";
//		p = p->next;
//	}
//	cout << p->data << endl;
//	del(head, 2);
//	p = head->next;
//	while (p->next != NULL)
//	{
//		cout << p->data << " ";
//		p = p->next;
//	}
//	cout << p->data << endl;
//	return 0;
//}
//void doNothing(int&);
//struct Node
//{
//	long d;
//	Node* next;
//};
//long n;
//long m;
//Node* head, * p, * r;
//int main()
//{
//	cin >> n >> m;
//	/*[[maybe_unuused]] int a{ 6 };
//	int x;
//	doNothing(x);
//	[[maybe_unused]] int y{ 0 };*/
//	head = new Node;
//	head->d = 1;
//	head->next = NULL;
//	r = head;
//	long i = 0;
//	long j = 0;
//	for (i = 2; i <= n; i++)
//	{
//		p = new Node;
//		p->d = i;
//		p->next = NULL;
//		r->next = p;
//		r = p;
//	}
//	r->next = head;
//	r = head;
//	for (i = 1; i <= n; i++)
//	{
//		for (j = 1; j <= m - 2; j++)
//		{
//			r = r->next;
//			cout << r->next->d << " ";
//			r->next = r->next->next;
//			r = r->next;
//		}
//	}
//	return 0;
//}
//#include<iostream>
//using namespace std;
//struct Node
//{
//	int d;
//	Node* next;
//};
//long n{ 0 };
//long m{ 0 };
//int main()
//{
//	cin >> n >> m;
//	Node* head = new Node;
//	Node* r = head;
//	head->d = 1;
//	head->next = NULL;
//	long i = 0;
//	long j = 0;
//	for (i = 2; i <= n; i++)
//	{
//		Node* p = new Node;
//		p->d = i;
//		p->next = head;
//		r->next = p;
//		r = p;
//	}
//	Node* curr = head;
//	for (i = 1; i <= n; i++)
//	{
//		for (j = 1; j < m - 1; j++)
//		{
//			curr = curr->next;
//		}
//		cout << curr->next->d << " ";
//		Node* temp = curr -> next;
//		curr->next = curr->next->next;
//		delete temp;
//		curr = curr->next;
//	}
//	return 0;
//}
//#include<iostream>
//using namespace std;
//struct Node
//{
//	int data;
//	Node* next;
//};
//Node* p = new Node;
//Node* r = new Node;
//Node* head = new Node;
//void insert(Node * head,int x,int y)
//{
//	Node* s = new Node;
//	while (p->next != NULL)
//	{
//		p = p->next;
//	}
//	if (p == NULL)
//	{
//		return;
//	}
//	else
//	{
//		while (p->next->data != x)
//		{
//			p = p->next;
//		}
//		p = p->next;
//		s->data = y;
//		s->next = p->next;
//		p->next = s;
//	}
//
//}
//void del(Node* head, int x)
//{
//
//	Node* s = new Node;
//	while (p->next != NULL)
//	{
//		p = p->next;
//	}
//	if (p == NULL)
//	{
//		return;
//	}
//	else
//	{
//		while (p->next->data != x)
//		{
//			p = p->next;
//		}
//		s = p->next -> next;
//		p -> next -> next = p->next->next -> next;
//		free(s);
//
//	}
//}
//int main()
//{
//	int n = 0;
//	cin >> n;
//	int i = 0;
//	int temp = 0;
//	int x = 0;
//	int y = 0;
//	
//	head->next = NULL;
//	for (i = 1; i <= n; i++)
//	{
//		cin >> temp;
//		if (temp == 1)
//		{
//			cin >> x >> y;
//			p->data = x;
//			insert(head,x,y);
//		}
//		else if (temp == 2)
//		{
//			cin >> x;
//			if (p->next == NULL)
//			{
//				cout << 0 << endl;
//			}
//			else
//			{
//				cout << p->next->data << endl;
//			}
//		}
//		else if (temp == 3)
//		{
//			cin >> x;
//		    del(head,x);
//		}
//	}
//	return 0;
//}
#include<iostream>
#include<unordered_map>
using namespace std;
struct Node
{
	int data;
	Node* next;
};
unordered_map<int, Node*>nodeMap;
void insert(Node* head, int x, int y)
{
	if (nodeMap.find(x) == nodeMap.end())
	{
		Node* p = head;
		while (p->next != NULL)
		{
			p = p->next;
		}
		Node* newNode = new Node;
		newNode->data = y;
		newNode->next = NULL;
		p->next = newNode;
		nodeMap[y] = newNode;
	}
	else
	{
		Node* p = nodeMap[x];
		Node* newNode = new Node;
		newNode->data = y;
		newNode->next = p -> next;
		p->next = newNode;
		nodeMap[y] = newNode;
	}
}
int Find(Node* head, int x)
{
	if (nodeMap.find(x) == nodeMap.end() || nodeMap[x]->next == NULL)
	{
		return 0;
	}
	//Node* p = nodeMap[x];
	return nodeMap[x]->next->data;
}
void del(Node* head, int x)
{
	if (nodeMap.find(x) == nodeMap.end())
	{
		return;
	}
	Node* p = nodeMap[x];
	if (p->next != NULL)
	{
		Node* temp = p->next;
		nodeMap.erase(p->next->data);
		p->next = p->next->next;
		delete temp;
	}
}
int main()
{
	int q = 0;
	cin >> q;
	Node* head = new Node;
	head->data = 1;
	head->next = NULL;
	nodeMap[1] = head;
	int i = 0;
	for (i = 1; i <= q; i++)
	{
		int op = 0;
		cin >> op;
		if (op == 1)
		{
			int x = 0;
			int y = 0;
			cin >> x >> y;
			insert(head, x, y);
		}
		else if (op == 2)
		{
			int x = 0;
			cin >> x;
			cout << Find(head, x) << endl;
		}
		else if (op == 3)
		{
			int x = 0;
			cin >> x;
			del(head, x);
		}
	}
	Node* curr = head;
	while (curr != NULL)
	{
		Node* temp = curr;
		curr = curr->next;
		delete temp;
	}
	return 0;
}